package samfeng.erp.product.category.service;

import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.framework.common.util.collection.TreeUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import java.util.stream.Collectors;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import samfeng.erp.product.category.controller.admin.vo.*;
import samfeng.erp.product.category.convert.ProductCategoryConvert;
import samfeng.erp.product.category.dal.dataobject.ProductCategoryDO;
import samfeng.erp.product.category.dal.mysql.ProductCategoryMapper;
import samfeng.erp.product.category.enmus.CommonConstants;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static samfeng.erp.product.category.enmus.ErrorCodeConstants.CATEGORY_NOT_EXISTS;

/**
 * 产品类别 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class ProductCategoryServiceImpl implements ProductCategoryService {

    @Resource
    private ProductCategoryMapper productCategoryMapper;

    @Override
    public Long createCategory(ProductCategoryCreateReqVO createReqVO) {
        // 插入
        ProductCategoryDO category = ProductCategoryConvert.INSTANCE.convert(createReqVO);
        productCategoryMapper.insert(category);
        // 返回
        return category.getId();
    }

    @Override
    public void updateCategory(ProductCategoryDO updateReqVO) {
        // 校验存在
        this.validateCategoryExists(updateReqVO.getId());
        // 更新
//        ProductCategoryDO updateObj = ProductCategoryConvert.INSTANCE.convert(updateReqVO);
        productCategoryMapper.updateById(updateReqVO);
    }

    @Override
    public void deleteCategory(Long id) {
        // 校验存在
        this.validateCategoryExists(id);
        // 删除
        productCategoryMapper.deleteById(id);
    }

    private void validateCategoryExists(Long id) {
        if (productCategoryMapper.selectById(id) == null) {
            throw exception(CATEGORY_NOT_EXISTS);
        }
    }

    @Override
    public ProductCategoryDO getCategory(Long id) {
        return productCategoryMapper.selectById(id);
    }

    @Override
    public List<ProductCategoryDO> getCategoryList(Collection<Long> ids) {
        return productCategoryMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<ProductCategoryDO> getCategoryPage(ProductCategoryPageReqVO pageReqVO) {
        return productCategoryMapper.selectPage(pageReqVO);
    }

    @Override
    public List<ProductCategoryDO> getCategoryList(ProductCategoryExportReqVO exportReqVO) {
        return productCategoryMapper.selectList(exportReqVO);
    }

    @Override
    public List<CategoryTreeListReqVO> getCategoryTreeList() {
        List<ProductCategoryDO> productCategoryDos = productCategoryMapper.selectList();
        return getTree(productCategoryDos);
    }

    @Override
    public void updateProuctStatus(String status, String id) {
        this.validateCategoryExists(Long.valueOf(id));
        productCategoryMapper.updateStateById(status, id);
    }

//    @Override
//    public List<Long> productCategoryIdList(ProductCategoryDO productCategoryDO) {
//        List<Long> gcIdList = new ArrayList<>();
//        Long parentId = productCategoryDO.getParentId();
//        gcIdList.add(productCategoryDO.getId());
//        while (!CommonConstants.PARENT_ID.equals(parentId)) {
//            gcIdList.add(0, parentId);
//            ProductCategoryDO pGoodsCategory = productCategoryMapper.selectOne(Wrappers.<ProductCategoryDO>lambdaQuery().eq(ProductCategoryDO::getId, parentId));
//            parentId = pGoodsCategory.getParentId();
//        }
//        return gcIdList;
//    }

    private List<CategoryTreeListReqVO> getTree(List<ProductCategoryDO> entitys) {
        List<CategoryTreeListReqVO> treeList = entitys.stream()
                .filter(entity -> !entity.getId().equals(entity.getParentId()))
                .sorted(Comparator.comparingInt(ProductCategoryDO::getSort))
                .map(entity -> {
                    CategoryTreeListReqVO node = new CategoryTreeListReqVO();
                    BeanUtil.copyProperties(entity,node);
                    return node;
                }).collect(Collectors.toList());
        return TreeUtil.build(treeList, CommonConstants.PARENT_ID);
    }

}
